package util;

import entidades.Usuario;
import entidades.Perfil;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;
import java.util.HashMap;
import java.util.LinkedList;

/**
 *
 * @author JFM
 */
public class Sesiones
    {
    /* ---------------------- */
	/* ------- Campos ------- */
    /* ---------------------- */

    public static final long MINUTOS_TIMEOUT = 20;

    private static HashMap<String, SessionData> logueados;
    static { logueados = new HashMap<String, SessionData>(); }





    /* ----------------------- */
    /* ------- Metodos ------- */
    /* ----------------------- */

    public static boolean loguear(HttpSession session, String nombre, String password) throws java.sql.SQLException
        {
		Usuario usuario = Usuario.login(nombre, MySQL.toMD5(password));

		if(usuario != null && usuario.getId() != 0)
            {
			logueados.remove(session.getId());
			logueados.put(session.getId(), new SessionData(usuario));
			return true;
			}

		return false;
        }

    public static boolean loguear(HttpSession session, Usuario usuario)
        {
		if(session != null && usuario != null)
			{
			logueados.remove(session.getId());
			logueados.put(session.getId(), new SessionData(usuario));
			return true;
			}

		return false;
        }

	 public static Usuario getUsuario(HttpSession session)
        { return (session != null)? logueados.get( session.getId() ).usuario : null; }

    public static boolean isLogueado(HttpSession session)
        { return session != null && logueados.containsKey(session.getId()) ; }

	public static boolean tienePermiso(HttpSession session, String lugar, String accion)
		{
		Usuario user = getUsuario(session);
		if(user != null)
			{ return user.tienePermiso(lugar, accion); }
		return false;
		}

	public static void desloguear(HttpSession session)
		{ if(session != null) { logueados.remove(session.getId()); } }

    public static void desloguear(String usuario)
        {
        Object keys[] = logueados.keySet().toArray();
        for(int i=0; i<keys.length; i++)
            {
            Sesiones.SessionData data = logueados.get( (String) keys[i] );
            if(usuario.compareTo(data.usuario.getNombre()) == 0)
                {
                logueados.remove(keys[i].toString());
                i = i + keys.length;
                }
            }
        }

    public static List listarUsuariosConectados()
        {
        Object array[] = logueados.values().toArray();
        LinkedList lista = new LinkedList();
        for(int i=0; i<array.length; i++) lista.add(array[i]);
        return lista;
        }



    /* ------- Clase privada ------- */

    public static class SessionData
        {
        Usuario usuario;
        Date tiempoLogin;
        Date tiempoUltimaAccion;
        String ultimaAccion;

        SessionData(Usuario usuario)
            {
            this.usuario = usuario;
            this.tiempoLogin = new Date();
            this.tiempoUltimaAccion = new Date();
            ultimaAccion = "";
            }
        }
    }
